home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / list.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  5KB  |  145 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  list.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_LIST_H
  16. #define LEDA_LIST_H
  17.  
  18. #include <LEDA/impl/dlist.h>
  19.  
  20.  
  21. template<class type> 
  22.  
  23. class _CLASSTYPE list : public dlist 
  24. {
  25.  
  26. type X;
  27.  
  28. int  cmp(GenPtr x, GenPtr y) const
  29.                             { return compare(ACCESS(type,x),ACCESS(type,y));}
  30. void print_el(GenPtr& x,ostream& out) const { Print(ACCESS(type,x),out);  }
  31. void read_el(GenPtr& x,istream& in)   { Read(X,in); x = Copy(X); }
  32. void clear_el(GenPtr& x)              const { Clear(ACCESS(type,x)); }
  33. void copy_el(GenPtr& x)               const { x = Copy(ACCESS(type,x)); }
  34.  
  35. int  int_type() const { return INT_TYPE(type); }
  36.  
  37. public:
  38.  
  39. list_item push(type a)   { return dlist::push(Copy(a));}
  40. list_item append(type a) { return dlist::append(Copy(a));}
  41. list_item insert(type a, list_item l, int dir=0)
  42.                          { return dlist::insert(Copy(a),l,dir); }
  43.  
  44. type  contents(list_item l) const { return ACCESS(type,dlist::contents(l)); }
  45. type  inf(list_item l)      const { return contents(l); }
  46.  
  47. GenPtr forall_loop_test(GenPtr it, type& x) const
  48. { if (it) x = contents(list_item(it));
  49.   return it;
  50.  }
  51.  
  52. type  head()                const { return ACCESS(type,dlist::head()); }
  53. type  tail()                const { return ACCESS(type,dlist::tail()); }
  54.  
  55.  
  56. type  pop() { GenPtr x=dlist::pop(); 
  57.               type   y=ACCESS(type,x); 
  58.               Clear(ACCESS(type,x)); 
  59.               return y; }
  60.  
  61. type  Pop() { GenPtr x=dlist::Pop(); 
  62.               type   y=ACCESS(type,x); 
  63.               Clear(ACCESS(type,x)); 
  64.               return y; }
  65.  
  66. type  del_item(list_item a) { GenPtr x=dlist::del(a);
  67.                               type   y=ACCESS(type,x);
  68.                               Clear(ACCESS(type,x));
  69.                               return y; }
  70.  
  71. type  del(list_item a)           { return del_item(a); }
  72.  
  73. void  assign(list_item p,type a) { dlist::assign(p,Copy(a));}
  74.  
  75. void  conc(list<type>& l)              { dlist::conc((dlist&)l); }
  76. void  split(list_item p, list<type>& l1, list<type>& l2)
  77.                                  { dlist::split(p,(dlist&)l1,(dlist&)l2);}
  78.  
  79. list_item search(type a) const   { return dlist::search(Convert(a)); }
  80. int       rank(type a)   const   { return dlist::rank(Convert(a)); }
  81.  
  82. list_item max()                      { return dlist::max(0); }
  83. list_item min()                      { return dlist::min(0); }
  84. list_item max(int (*f)(const type&,const type&)) 
  85.                                      { return dlist::max(CMP_PTR(f)); }
  86. list_item min(int (*f)(const type&,const type&)) 
  87.                                      { return dlist::min(CMP_PTR(f)); }
  88.  
  89. void  sort()                         { dlist::sort(0); }
  90. void  sort(int (*f)(const type&,const type&))  { dlist::sort(CMP_PTR(f)); }
  91.  
  92. void  apply(void (*f)(type&))   { dlist::apply(APP_PTR(f)); }
  93.  
  94. void  bucket_sort(int i, int j, int (*f)(const type&))
  95.                                      { dlist::bucket_sort(i,j,ORD_PTR(f)); }
  96.  
  97. list_item read_iterator(type& x) const 
  98. { GenPtr y; 
  99.   dlink* p=dlist::read_iterator(y);
  100.   if (p) x = ACCESS(type,y); 
  101.   return p; }
  102.  
  103. bool current_element(type& x) const {GenPtr y; bool b=dlist::current_element(y);
  104.                                      if (b) x = ACCESS(type,y); return b; }
  105. bool next_element(type& x)   const  {GenPtr y; bool b = dlist::next_element(y);
  106.                                      if (b) x = ACCESS(type,y); return b; }
  107. bool prev_element(type& x)   const  {GenPtr y; bool b = dlist::prev_element(y);
  108.                                      if (b) x = ACCESS(type,y); return b; }
  109.  
  110.  list() {}
  111.  list(type a)        : dlist(Copy(a)){}
  112.  
  113.  list(const list<type>& a) : dlist(a) {}
  114.  
  115. virtual ~list() { clear(); }
  116.  
  117. list<type>& operator=(const list<type>& a) 
  118. { dlist::operator=(a); return *this;}
  119.  
  120. #if !defined(__sgi)
  121. list<type>  operator+(const list<type>& a) 
  122. { dlist L = *(dlist*)this + *(dlist*)&a; return *(list<type>*)&L; }
  123. #endif
  124.  
  125. list_item operator+=(type x)   { return append(x); }
  126. list_item operator[](int i)    { return get_item(i); }
  127.  
  128. type&  operator[](list_item p) { return ACCESS(type,dlist::entry(p)); }
  129. type   operator[](list_item p) const { return contents(p); }
  130.  
  131. }; 
  132.  
  133.  
  134. //------------------------------------------------------------------------------
  135. // Iteration Macros
  136. //------------------------------------------------------------------------------
  137.  
  138. #define forall_list_items(a,L) for( a=(L).first(); a ; a=(L).succ(a) )
  139. #define Forall_list_items(a,L) for( a=(L).last();  a ; a=(L).pred(a) )
  140.  
  141.  
  142.  
  143. #endif
  144.